#loading the necessary packages
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6 ✔ purrr 0.3.4
✔ tibble 3.1.7 ✔ dplyr 1.0.9
✔ tidyr 1.2.0 ✔ stringr 1.4.0
✔ readr 2.1.2 ✔ forcats 0.5.1
Warning: package ‘ggplot2’ was built under R version 4.2.1Warning: package ‘dplyr’ was built under R version 4.2.1── Conflicts ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
library(janitor)
Warning: package ‘janitor’ was built under R version 4.2.1
Attaching package: ‘janitor’
The following objects are masked from ‘package:stats’:
chisq.test, fisher.test
library(readxl)
Warning: package ‘readxl’ was built under R version 4.2.1
library(here)
Warning: package ‘here’ was built under R version 4.2.1here() starts at C:/Users/nico-/OneDrive/Desktop/Codeclan/dirty_data_project/dirty_data_project/task_4/dirty_data_task_4
#loading the data
candy_2015 <- read_excel("../raw_data/boing-boing-candy-2015.xlsx") %>%
clean_names()
candy_2016 <- read_excel("../raw_data/boing-boing-candy-2016.xlsx") %>%
clean_names()
candy_2017 <- read_excel("../raw_data/boing-boing-candy-2017.xlsx") %>%
clean_names()
New names:
candy_2016
candy_2015
candy_2017
#order of operations: #decide which variables to keep for the
analysis according to business questions # Pivot data the same for all 3
datasets # perform pivot on all three # Investigate other columns
#only keeping variables useful for analysis from 2015 dataset #The
variables are a bit confusing. I will only keep variables that are
actual food and drop anything which is not food.
candy_2015 <- candy_2015 %>%
select(-c(
cash_or_other_forms_of_legal_tender,
creepy_religious_comics_chick_tracts,
hugs_actual_physical_hugs,
please_leave_any_remarks_or_comments_regarding_your_choices:
please_estimate_the_degrees_of_separation_you_have_from_the_following_folks_beyonce_knowles,
dental_paraphenalia,
generic_brand_acetaminophen,
peterson_brand_sidewalk_chalk
))
candy_2015
#time to rename some columns. Maybe not that necessary but I would
like to have my final results with neat names.
candy_2015 <- candy_2015 %>%
rename("trick_or_treat" = are_you_going_actually_going_trick_or_treating_yourself,
"grand_bar" = x100_grand_bar,
"brown_globs" = anonymous_brown_globs_that_come_in_black_and_orange_wrappers,
"any_candy_bar" = any_full_sized_candy_bar,
"brach_without_candy_corn" = brach_products_not_including_candy_corn,
"high_fructose_corn_syrup" = vials_of_pure_high_fructose_corn_syrup_for_main_lining_into_your_vein,
"restaurant_candy" = candy_that_is_clearly_just_the_stuff_given_out_for_free_at_restaurants,
"chick_o_sticks" = chick_o_sticks_we_don_t_know_what_that_is,
"old_marshmallow" = those_odd_marshmallow_circus_peanut_things)
candy_2015
#same thing for the 2016 dataset
#selecting only the necessary columns for final analysis
candy_2016 <- candy_2016 %>%
select(-c(cash_or_other_forms_of_legal_tender,
creepy_religious_comics_chick_tracts,
dental_paraphenalia,
generic_brand_acetaminophen,
hugs_actual_physical_hugs,
person_of_interest_season_3_dvd_box_set_not_including_disc_4_with_hilarious_outtakes,
sourpatch_kids_i_e_abominations_of_nature,
vials_of_pure_high_fructose_corn_syrup_for_main_lining_into_your_vein,
please_list_any_items_not_included_above_that_give_you_joy:
york_peppermint_patties_ignore))
candy_2016
candy_2016 <- candy_2016 %>%
rename("trick_or_treat" = are_you_going_actually_going_trick_or_treating_yourself,
"gender" = your_gender,
"age" = how_old_are_you,
"country" = which_country_do_you_live_in,
"state_province" = which_state_province_county_do_you_live_in,
"grand_bar" = x100_grand_bar,
"brown_globs" = anonymous_brown_globs_that_come_in_black_and_orange_wrappers,
)
candy_2016
#candy 2017
candy_2017 <- candy_2017 %>%
select(-c(q7_joy_other : click_coordinates_x_y))
candy_2017
#clean column: removing the q+numnber_ before variable name
candy_2017 <- candy_2017 %>%
rename_with(~ str_remove(., pattern = "q[0-90-9]+_"))
candy_2017
#pivot longer all the datasets
library(tidyr)
#2015
candy_2015 <- candy_2015 %>%
pivot_longer("butterfinger":"york_peppermint_patties",
names_to = "candy_type",
values_to = "rating")
candy_2015
#2016
candy_2016 <- candy_2016 %>%
pivot_longer("grand_bar":"york_peppermint_patties",
names_to = "candy_type",
values_to = "rating")
candy_2016
#2017
candy_2017 <- candy_2017 %>%
pivot_longer("100_grand_bar":"york_peppermint_patties",
names_to = "candy_type",
values_to = "rating")
candy_2017
#binding all the datasets
bind_rows(candy_2015,
candy_2016,
candy_2017,
.id = "year")
#sort out age column and country column
#binding rows, so making sure all the variable have the same name
candy_2015 <- candy_2015 %>%
rename(age = "how_old_are_you")
candy_2015
candy_2017 <- candy_2017 %>%
rename(trick_or_treat = "going_out")
candy_2017
#binding the 3 datasets
candy <- bind_rows(candy_2015,
candy_2016,
candy_2017)
candy
#let’s clean once again candy_type
candy <- candy %>%
mutate(candy_type = recode(candy_type,
"anonymous_brown_globs_that_come_in_black_and_orange_wrappers_a_k_a_mary_janes" = "mary_janes"),
candy_type = recode(candy_type,"bonkers_the_candy" = "bonkers"),
candy_type = recode(candy_type,"boxo_raisins" = "box_o_raisins"),
candy_type = recode(candy_type,"licorice_yes_black" = "licorice"),
candy_type = recode(candy_type,"sweetums_a_friend_to_diabetes" = "sweetums"))
candy
#country column
candy <- candy %>%
mutate(country = if_else(grepl("(?i)usa+", country),"USA",country)) %>%
mutate(country = if_else(grepl("(?i)united s+", country),"USA",country)) %>%
mutate(country = if_else(grepl("(?i)amer", country),"USA",country)) %>%
mutate(country = if_else(grepl("(?i)stat", country),"USA",country)) %>%
mutate(country = if_else(grepl("(?i)subscribe+.*", country),NA_character_,country))
#make vectors of USA outliers and some to change to NA values
usa_outliers = c("Alaska", "California", "EUA", "Merica", "Murica", "murrika",
"New Jersey", "New York", "North Carolina", "Pittsburgh",
"The Yoo Ess of Aaayyyyyy", "Trumpistan", "U S", "u s a", "u.s.",
"U.s.", "U.S.", "u.s.a.", "U.S.A.", "UD", "us", "Us", "US", "US of A",
"USSA", "'merica")
change_to_NA = c(1, 30.0, 32, 35, 44.0, 45, 45.0, 46, 47.0, 51.0, 54.0)
change_to_NA2 = c("30.0", "44.0", "45.0", "47.0", "51.0", "54.0")
others = c(
"A tropical island south of the equator", "A", "Atlantis",
"Canae", "cascadia ", "Cascadia", "Denial", "Earth", "Fear and Loathing",
"god's country", "I don't know anymore", "insanity lately",
"there isn't one for old men", "soviet canuckistan", "Narnia", "Neverland",
"one of the best ones", "See above", "Somewhere",
"Subscribe To Dm4uz3 On Youtube", "The republic of Cascadia", "this one",
"Europe", " Cascadia", "Cascadia ")
candy
candy <- candy %>%
mutate(country = if_else(country %in% usa_outliers ,
"USA", country)) %>%
mutate(country = if_else(country %in% others|
country %in% change_to_NA|
country %in% change_to_NA2,
NA_character_, country)) %>%
mutate(country = str_to_title(country))
candy
candy <- candy %>%
mutate(country = recode(country, "The Netherlands" = "Netherlands"),
country = recode(country, "Can" = "Canada"),
country = recode(country, "Canada`" = "Canada"),
country = recode(country, "Endland" = "United Kingdom"),
country = recode(country, "England" = "United Kingdom"),
country = recode(country, "England" = "United Kingdom"),
country = recode(country, "Scotland" = "United Kingdom"),
country = recode(country, "España" = "Spain"),
country = recode(country, "U.k." = "United Kingdom"),
country = recode(country, "Uk" = "United Kingdom"),
country = recode(country, "United Kindom" = "United Kingdom"))
candy
candy <- candy %>%
mutate(age = as.numeric(age)) %>%
mutate(age = ifelse(age>122, NA, age))
Warning: NAs introduced by coercion
candy
#write data to csv
candy %>%
write_csv("../clean_data/candy_clean.csv")
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQojbG9hZGluZyB0aGUgbmVjZXNzYXJ5IHBhY2thZ2VzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShoZXJlKQ0KYGBgDQoNCmBgYHtyfQ0KI2xvYWRpbmcgdGhlIGRhdGENCmNhbmR5XzIwMTUgPC0gcmVhZF9leGNlbCgiLi4vcmF3X2RhdGEvYm9pbmctYm9pbmctY2FuZHktMjAxNS54bHN4IikgJT4lIA0KICBjbGVhbl9uYW1lcygpDQpjYW5keV8yMDE2IDwtIHJlYWRfZXhjZWwoIi4uL3Jhd19kYXRhL2JvaW5nLWJvaW5nLWNhbmR5LTIwMTYueGxzeCIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KY2FuZHlfMjAxNyA8LSByZWFkX2V4Y2VsKCIuLi9yYXdfZGF0YS9ib2luZy1ib2luZy1jYW5keS0yMDE3Lnhsc3giKSAlPiUgDQogIGNsZWFuX25hbWVzKCkNCmBgYA0KDQpgYGB7cn0NCmNhbmR5XzIwMTYNCmNhbmR5XzIwMTUNCmNhbmR5XzIwMTcNCmBgYA0KDQoNCiNvcmRlciBvZiBvcGVyYXRpb25zOiANCiNkZWNpZGUgd2hpY2ggdmFyaWFibGVzIHRvIGtlZXAgZm9yIHRoZSBhbmFseXNpcyBhY2NvcmRpbmcgdG8gYnVzaW5lc3MgcXVlc3Rpb25zDQojIFBpdm90IGRhdGEgdGhlIHNhbWUgZm9yIGFsbCAzIGRhdGFzZXRzDQojIHBlcmZvcm0gcGl2b3Qgb24gYWxsIHRocmVlDQojIEludmVzdGlnYXRlIG90aGVyIGNvbHVtbnMNCg0KDQojb25seSBrZWVwaW5nIHZhcmlhYmxlcyB1c2VmdWwgZm9yIGFuYWx5c2lzIGZyb20gMjAxNSBkYXRhc2V0DQojVGhlIHZhcmlhYmxlcyBhcmUgYSBiaXQgY29uZnVzaW5nLiBJIHdpbGwgb25seSBrZWVwIHZhcmlhYmxlcyB0aGF0IGFyZSBhY3R1YWwgZm9vZCBhbmQgZHJvcCBhbnl0aGluZyB3aGljaCBpcyBub3QgZm9vZC4gIA0KYGBge3J9DQpjYW5keV8yMDE1IDwtIGNhbmR5XzIwMTUgJT4lIA0KICBzZWxlY3QoLWMoDQogICAgY2FzaF9vcl9vdGhlcl9mb3Jtc19vZl9sZWdhbF90ZW5kZXIsIA0KICAgIGNyZWVweV9yZWxpZ2lvdXNfY29taWNzX2NoaWNrX3RyYWN0cywgDQogICAgaHVnc19hY3R1YWxfcGh5c2ljYWxfaHVncywgDQogICAgcGxlYXNlX2xlYXZlX2FueV9yZW1hcmtzX29yX2NvbW1lbnRzX3JlZ2FyZGluZ195b3VyX2Nob2ljZXM6IA0KICAgIHBsZWFzZV9lc3RpbWF0ZV90aGVfZGVncmVlc19vZl9zZXBhcmF0aW9uX3lvdV9oYXZlX2Zyb21fdGhlX2ZvbGxvd2luZ19mb2xrc19iZXlvbmNlX2tub3dsZXMsIA0KICAgIGRlbnRhbF9wYXJhcGhlbmFsaWEsIA0KICAgIGdlbmVyaWNfYnJhbmRfYWNldGFtaW5vcGhlbiwgDQogICAgcGV0ZXJzb25fYnJhbmRfc2lkZXdhbGtfY2hhbGsNCikpDQpjYW5keV8yMDE1DQpgYGANCiN0aW1lIHRvIHJlbmFtZSBzb21lIGNvbHVtbnMuIE1heWJlIG5vdCB0aGF0IG5lY2Vzc2FyeSBidXQgSSB3b3VsZCBsaWtlIHRvIGhhdmUgbXkgZmluYWwgcmVzdWx0cyB3aXRoIG5lYXQgbmFtZXMuIA0KDQpgYGB7cn0NCmNhbmR5XzIwMTUgPC0gY2FuZHlfMjAxNSAlPiUgDQogIHJlbmFtZSgidHJpY2tfb3JfdHJlYXQiID0gYXJlX3lvdV9nb2luZ19hY3R1YWxseV9nb2luZ190cmlja19vcl90cmVhdGluZ195b3Vyc2VsZiwNCiAgICAgICAgICJncmFuZF9iYXIiID0geDEwMF9ncmFuZF9iYXIsIA0KICAgICAgICAgImJyb3duX2dsb2JzIiA9IGFub255bW91c19icm93bl9nbG9ic190aGF0X2NvbWVfaW5fYmxhY2tfYW5kX29yYW5nZV93cmFwcGVycywgDQogICAgICAgICAiYW55X2NhbmR5X2JhciIgPSBhbnlfZnVsbF9zaXplZF9jYW5keV9iYXIsIA0KICAgICAgICAgImJyYWNoX3dpdGhvdXRfY2FuZHlfY29ybiIgPSBicmFjaF9wcm9kdWN0c19ub3RfaW5jbHVkaW5nX2NhbmR5X2Nvcm4sIA0KICAgICAgICAgImhpZ2hfZnJ1Y3Rvc2VfY29ybl9zeXJ1cCIgPSB2aWFsc19vZl9wdXJlX2hpZ2hfZnJ1Y3Rvc2VfY29ybl9zeXJ1cF9mb3JfbWFpbl9saW5pbmdfaW50b195b3VyX3ZlaW4sIA0KICAgICAgICAgInJlc3RhdXJhbnRfY2FuZHkiID0gY2FuZHlfdGhhdF9pc19jbGVhcmx5X2p1c3RfdGhlX3N0dWZmX2dpdmVuX291dF9mb3JfZnJlZV9hdF9yZXN0YXVyYW50cywgDQogICAgICAgICAiY2hpY2tfb19zdGlja3MiICA9IGNoaWNrX29fc3RpY2tzX3dlX2Rvbl90X2tub3dfd2hhdF90aGF0X2lzLCANCiAgICAgICAgICJvbGRfbWFyc2htYWxsb3ciID0gdGhvc2Vfb2RkX21hcnNobWFsbG93X2NpcmN1c19wZWFudXRfdGhpbmdzKQ0KY2FuZHlfMjAxNQ0KYGBgDQojc2FtZSB0aGluZyBmb3IgdGhlIDIwMTYgZGF0YXNldCANCmBgYHtyfQ0KI3NlbGVjdGluZyBvbmx5IHRoZSBuZWNlc3NhcnkgY29sdW1ucyBmb3IgZmluYWwgYW5hbHlzaXMNCmNhbmR5XzIwMTYgPC0gY2FuZHlfMjAxNiAlPiUgDQogIHNlbGVjdCgtYyhjYXNoX29yX290aGVyX2Zvcm1zX29mX2xlZ2FsX3RlbmRlciwgDQogICAgICAgICAgICBjcmVlcHlfcmVsaWdpb3VzX2NvbWljc19jaGlja190cmFjdHMsIA0KICAgICAgICAgICAgZGVudGFsX3BhcmFwaGVuYWxpYSwgDQogICAgICAgICAgICBnZW5lcmljX2JyYW5kX2FjZXRhbWlub3BoZW4sIA0KICAgICAgICAgICAgaHVnc19hY3R1YWxfcGh5c2ljYWxfaHVncywgDQogICAgICAgICAgICBwZXJzb25fb2ZfaW50ZXJlc3Rfc2Vhc29uXzNfZHZkX2JveF9zZXRfbm90X2luY2x1ZGluZ19kaXNjXzRfd2l0aF9oaWxhcmlvdXNfb3V0dGFrZXMsIA0KICAgICAgICAgICAgc291cnBhdGNoX2tpZHNfaV9lX2Fib21pbmF0aW9uc19vZl9uYXR1cmUsIA0KICAgICAgICAgICAgdmlhbHNfb2ZfcHVyZV9oaWdoX2ZydWN0b3NlX2Nvcm5fc3lydXBfZm9yX21haW5fbGluaW5nX2ludG9feW91cl92ZWluLCANCiAgICAgICAgICAgIHBsZWFzZV9saXN0X2FueV9pdGVtc19ub3RfaW5jbHVkZWRfYWJvdmVfdGhhdF9naXZlX3lvdV9qb3k6DQogICAgICAgICAgICAgIHlvcmtfcGVwcGVybWludF9wYXR0aWVzX2lnbm9yZSkpDQpjYW5keV8yMDE2DQpgYGANCg0KYGBge3J9DQpjYW5keV8yMDE2IDwtIGNhbmR5XzIwMTYgJT4lIA0KICByZW5hbWUoInRyaWNrX29yX3RyZWF0IiA9IGFyZV95b3VfZ29pbmdfYWN0dWFsbHlfZ29pbmdfdHJpY2tfb3JfdHJlYXRpbmdfeW91cnNlbGYsIA0KICAgICAgICAgImdlbmRlciIgPSB5b3VyX2dlbmRlciwgDQogICAgICAgICAiYWdlIiA9IGhvd19vbGRfYXJlX3lvdSwgDQogICAgICAgICAiY291bnRyeSIgPSB3aGljaF9jb3VudHJ5X2RvX3lvdV9saXZlX2luLCANCiAgICAgICAgICJzdGF0ZV9wcm92aW5jZSIgPSB3aGljaF9zdGF0ZV9wcm92aW5jZV9jb3VudHlfZG9feW91X2xpdmVfaW4sIA0KICAgICAgICAgImdyYW5kX2JhciIgPSB4MTAwX2dyYW5kX2JhciwgDQogICAgICAgICAiYnJvd25fZ2xvYnMiID0gYW5vbnltb3VzX2Jyb3duX2dsb2JzX3RoYXRfY29tZV9pbl9ibGFja19hbmRfb3JhbmdlX3dyYXBwZXJzLCANCiAgICAgICAgICkNCmNhbmR5XzIwMTYNCmBgYA0KI2NhbmR5IDIwMTcNCg0KYGBge3J9DQpjYW5keV8yMDE3IDwtIGNhbmR5XzIwMTcgJT4lIA0KICBzZWxlY3QoLWMocTdfam95X290aGVyIDogY2xpY2tfY29vcmRpbmF0ZXNfeF95KSkNCmNhbmR5XzIwMTcNCmBgYA0KI2NsZWFuIGNvbHVtbjogcmVtb3ZpbmcgdGhlIHErbnVtbmJlcl8gYmVmb3JlIHZhcmlhYmxlIG5hbWUgDQoNCmBgYHtyfQ0KY2FuZHlfMjAxNyA8LSBjYW5keV8yMDE3ICU+JSANCiAgcmVuYW1lX3dpdGgofiBzdHJfcmVtb3ZlKC4sIHBhdHRlcm4gPSAicVswLTkwLTldK18iKSkNCmNhbmR5XzIwMTcNCmBgYA0KDQojcGl2b3QgbG9uZ2VyIGFsbCB0aGUgZGF0YXNldHMNCmBgYHtyfQ0KbGlicmFyeSh0aWR5cikNCmBgYA0KYGBge3J9DQojMjAxNQ0KY2FuZHlfMjAxNSA8LSBjYW5keV8yMDE1ICU+JSANCiAgcGl2b3RfbG9uZ2VyKCJidXR0ZXJmaW5nZXIiOiJ5b3JrX3BlcHBlcm1pbnRfcGF0dGllcyIsDQpuYW1lc190byA9ICJjYW5keV90eXBlIiwgDQp2YWx1ZXNfdG8gPSAicmF0aW5nIikNCmNhbmR5XzIwMTUNCmBgYA0KYGBge3J9DQojMjAxNg0KY2FuZHlfMjAxNiA8LSBjYW5keV8yMDE2ICU+JSANCiAgcGl2b3RfbG9uZ2VyKCJncmFuZF9iYXIiOiJ5b3JrX3BlcHBlcm1pbnRfcGF0dGllcyIsDQpuYW1lc190byA9ICJjYW5keV90eXBlIiwgDQp2YWx1ZXNfdG8gPSAicmF0aW5nIikNCmNhbmR5XzIwMTYNCmBgYA0KDQoNCmBgYHtyfQ0KIzIwMTcNCmNhbmR5XzIwMTcgPC0gY2FuZHlfMjAxNyAlPiUgDQogIHBpdm90X2xvbmdlcigiMTAwX2dyYW5kX2JhciI6InlvcmtfcGVwcGVybWludF9wYXR0aWVzIiwNCm5hbWVzX3RvID0gImNhbmR5X3R5cGUiLCANCnZhbHVlc190byA9ICJyYXRpbmciKQ0KY2FuZHlfMjAxNw0KYGBgDQpgYGB7cn0NCiNiaW5kaW5nIGFsbCB0aGUgZGF0YXNldHMNCmJpbmRfcm93cyhjYW5keV8yMDE1LCANCiAgICAgICAgICBjYW5keV8yMDE2LCANCiAgICAgICAgICBjYW5keV8yMDE3LCANCiAgICAgICAgICAuaWQgPSAieWVhciIpDQpgYGANCg0KDQojc29ydCBvdXQgYWdlIGNvbHVtbiBhbmQgY291bnRyeSBjb2x1bW4gDQoNCmBgYHtyfQ0KI2JpbmRpbmcgcm93cywgc28gbWFraW5nIHN1cmUgYWxsIHRoZSB2YXJpYWJsZSBoYXZlIHRoZSBzYW1lIG5hbWUgDQpjYW5keV8yMDE1IDwtIGNhbmR5XzIwMTUgJT4lIA0KICByZW5hbWUoYWdlID0gImhvd19vbGRfYXJlX3lvdSIpDQpjYW5keV8yMDE1DQpjYW5keV8yMDE3IDwtIGNhbmR5XzIwMTcgJT4lIA0KICByZW5hbWUodHJpY2tfb3JfdHJlYXQgPSAiZ29pbmdfb3V0IikNCmNhbmR5XzIwMTcNCmBgYA0KDQpgYGB7cn0NCiNiaW5kaW5nIHRoZSAzIGRhdGFzZXRzDQpjYW5keSA8LSBiaW5kX3Jvd3MoY2FuZHlfMjAxNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZHlfMjAxNiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZHlfMjAxNykNCmNhbmR5DQpgYGANCg0KI2xldCdzIGNsZWFuIG9uY2UgYWdhaW4gY2FuZHlfdHlwZSANCmBgYHtyfQ0KY2FuZHkgPC0gY2FuZHkgJT4lIA0KICBtdXRhdGUoY2FuZHlfdHlwZSA9IHJlY29kZShjYW5keV90eXBlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFub255bW91c19icm93bl9nbG9ic190aGF0X2NvbWVfaW5fYmxhY2tfYW5kX29yYW5nZV93cmFwcGVyc19hX2tfYV9tYXJ5X2phbmVzIiA9ICJtYXJ5X2phbmVzIiksDQogIGNhbmR5X3R5cGUgPSByZWNvZGUoY2FuZHlfdHlwZSwiYm9ua2Vyc190aGVfY2FuZHkiID0gImJvbmtlcnMiKSwNCiAgY2FuZHlfdHlwZSA9IHJlY29kZShjYW5keV90eXBlLCJib3hvX3JhaXNpbnMiID0gImJveF9vX3JhaXNpbnMiKSwNCiAgY2FuZHlfdHlwZSA9IHJlY29kZShjYW5keV90eXBlLCJsaWNvcmljZV95ZXNfYmxhY2siID0gImxpY29yaWNlIiksDQogIGNhbmR5X3R5cGUgPSByZWNvZGUoY2FuZHlfdHlwZSwic3dlZXR1bXNfYV9mcmllbmRfdG9fZGlhYmV0ZXMiID0gInN3ZWV0dW1zIikpDQogIGNhbmR5DQpgYGANCiNjb3VudHJ5IGNvbHVtbg0KDQpgYGB7cn0NCmNhbmR5IDwtIGNhbmR5ICU+JSANCiAgbXV0YXRlKGNvdW50cnkgPSBpZl9lbHNlKGdyZXBsKCIoP2kpdXNhKyIsIGNvdW50cnkpLCJVU0EiLGNvdW50cnkpKSAlPiUgDQogIG11dGF0ZShjb3VudHJ5ID0gaWZfZWxzZShncmVwbCgiKD9pKXVuaXRlZCBzKyIsIGNvdW50cnkpLCJVU0EiLGNvdW50cnkpKSAlPiUgDQogIG11dGF0ZShjb3VudHJ5ID0gaWZfZWxzZShncmVwbCgiKD9pKWFtZXIiLCBjb3VudHJ5KSwiVVNBIixjb3VudHJ5KSkgJT4lIA0KICBtdXRhdGUoY291bnRyeSA9IGlmX2Vsc2UoZ3JlcGwoIig/aSlzdGF0IiwgY291bnRyeSksIlVTQSIsY291bnRyeSkpICU+JSANCiAgbXV0YXRlKGNvdW50cnkgPSBpZl9lbHNlKGdyZXBsKCIoP2kpc3Vic2NyaWJlKy4qIiwgY291bnRyeSksTkFfY2hhcmFjdGVyXyxjb3VudHJ5KSkgDQojbWFrZSB2ZWN0b3JzIG9mIFVTQSBvdXRsaWVycyBhbmQgc29tZSB0byBjaGFuZ2UgdG8gTkEgdmFsdWVzDQp1c2Ffb3V0bGllcnMgPSBjKCJBbGFza2EiLCAiQ2FsaWZvcm5pYSIsICJFVUEiLCAiTWVyaWNhIiwgIk11cmljYSIsICJtdXJyaWthIiwNCiAgICAgICAgICAgICAgICAgIk5ldyBKZXJzZXkiLCAiTmV3IFlvcmsiLCAiTm9ydGggQ2Fyb2xpbmEiLCAiUGl0dHNidXJnaCIsIA0KICAgICAgICAgICAgICAgICAiVGhlIFlvbyBFc3Mgb2YgQWFheXl5eXl5IiwgIlRydW1waXN0YW4iLCAiVSBTIiwgInUgcyBhIiwgInUucy4iLA0KICAgICAgICAgICAgICAgICAiVS5zLiIsICJVLlMuIiwgInUucy5hLiIsICJVLlMuQS4iLCAiVUQiLCAidXMiLCAiVXMiLCAiVVMiLCAiVVMgb2YgQSIsDQogICAgICAgICAgICAgICAgICJVU1NBIiwgIidtZXJpY2EiKQ0KY2hhbmdlX3RvX05BID0gYygxLCAzMC4wLCAzMiwgMzUsIDQ0LjAsIDQ1LCA0NS4wLCA0NiwgNDcuMCwgNTEuMCwgNTQuMCkNCmNoYW5nZV90b19OQTIgPSBjKCIzMC4wIiwgIjQ0LjAiLCAiNDUuMCIsICI0Ny4wIiwgIjUxLjAiLCAiNTQuMCIpDQpvdGhlcnMgPSBjKA0KICAiQSB0cm9waWNhbCBpc2xhbmQgc291dGggb2YgdGhlIGVxdWF0b3IiLCAiQSIsICJBdGxhbnRpcyIsDQogICJDYW5hZSIsICJjYXNjYWRpYSAiLCAiQ2FzY2FkaWEiLCAiRGVuaWFsIiwgIkVhcnRoIiwgIkZlYXIgYW5kIExvYXRoaW5nIiwgDQogICJnb2QncyBjb3VudHJ5IiwgIkkgZG9uJ3Qga25vdyBhbnltb3JlIiwgImluc2FuaXR5IGxhdGVseSIsIA0KICAidGhlcmUgaXNuJ3Qgb25lIGZvciBvbGQgbWVuIiwgInNvdmlldCBjYW51Y2tpc3RhbiIsICJOYXJuaWEiLCAiTmV2ZXJsYW5kIiwNCiAgIm9uZSBvZiB0aGUgYmVzdCBvbmVzIiwgIlNlZSBhYm92ZSIsICJTb21ld2hlcmUiLCANCiAgIlN1YnNjcmliZSBUbyBEbTR1ejMgT24gWW91dHViZSIsICJUaGUgcmVwdWJsaWMgb2YgQ2FzY2FkaWEiLCAidGhpcyBvbmUiLCANCiAgIkV1cm9wZSIsICIgQ2FzY2FkaWEiLCAiQ2FzY2FkaWEgIikNCmNhbmR5DQpgYGANCg0KYGBge3J9DQpjYW5keSA8LSBjYW5keSAlPiUNCm11dGF0ZShjb3VudHJ5ID0gaWZfZWxzZShjb3VudHJ5ICVpbiUgdXNhX291dGxpZXJzICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiVVNBIiwgY291bnRyeSkpICU+JSANCiAgbXV0YXRlKGNvdW50cnkgPSBpZl9lbHNlKGNvdW50cnkgJWluJSBvdGhlcnN8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgJWluJSBjaGFuZ2VfdG9fTkF8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnkgJWluJSBjaGFuZ2VfdG9fTkEyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BX2NoYXJhY3Rlcl8sIGNvdW50cnkpKSAlPiUgDQogIG11dGF0ZShjb3VudHJ5ID0gc3RyX3RvX3RpdGxlKGNvdW50cnkpKSANCmNhbmR5DQpgYGANCmBgYHtyfQ0KY2FuZHkgPC0gY2FuZHkgJT4lDQptdXRhdGUoY291bnRyeSA9IHJlY29kZShjb3VudHJ5LCAiVGhlIE5ldGhlcmxhbmRzIiA9ICJOZXRoZXJsYW5kcyIpLA0KICAgICAgIGNvdW50cnkgPSByZWNvZGUoY291bnRyeSwgIkNhbiIgPSAiQ2FuYWRhIiksDQogICAgICAgY291bnRyeSA9IHJlY29kZShjb3VudHJ5LCAiQ2FuYWRhYCIgPSAiQ2FuYWRhIiksDQogICAgICAgY291bnRyeSA9IHJlY29kZShjb3VudHJ5LCAiRW5kbGFuZCIgPSAiVW5pdGVkIEtpbmdkb20iKSwNCiAgICAgICBjb3VudHJ5ID0gcmVjb2RlKGNvdW50cnksICJFbmdsYW5kIiA9ICJVbml0ZWQgS2luZ2RvbSIpLA0KICAgICAgIGNvdW50cnkgPSByZWNvZGUoY291bnRyeSwgIkVuZ2xhbmQiID0gIlVuaXRlZCBLaW5nZG9tIiksDQogICAgICAgY291bnRyeSA9IHJlY29kZShjb3VudHJ5LCAiU2NvdGxhbmQiID0gIlVuaXRlZCBLaW5nZG9tIiksDQogICAgICAgY291bnRyeSA9IHJlY29kZShjb3VudHJ5LCAiRXNwYcOxYSIgPSAiU3BhaW4iKSwNCiAgICAgICBjb3VudHJ5ID0gcmVjb2RlKGNvdW50cnksICJVLmsuIiA9ICJVbml0ZWQgS2luZ2RvbSIpLA0KICAgICAgIGNvdW50cnkgPSByZWNvZGUoY291bnRyeSwgIlVrIiA9ICJVbml0ZWQgS2luZ2RvbSIpLA0KICAgICAgIGNvdW50cnkgPSByZWNvZGUoY291bnRyeSwgIlVuaXRlZCBLaW5kb20iID0gIlVuaXRlZCBLaW5nZG9tIikpDQpjYW5keQ0KYGBgDQpgYGB7cn0NCiMgQ29udmVydGluZyB0aGUgYWdlIHZhcmlhYmxlIHRvIG51bWVyaWMNCmNhbmR5IDwtIGNhbmR5ICU+JSANCiAgbXV0YXRlKGFnZSA9IGFzLm51bWVyaWMoYWdlKSkgJT4lIA0KICBtdXRhdGUoYWdlID0gaWZlbHNlKGFnZT4xMjIsIE5BLCBhZ2UpKQ0KY2FuZHkNCmBgYA0KDQpgYGB7cn0NCiN3cml0ZSBkYXRhIHRvIGNzdg0KY2FuZHkgJT4lIA0KICB3cml0ZV9jc3YoIi4uL2NsZWFuX2RhdGEvY2FuZHlfY2xlYW4uY3N2IikNCmBgYA0KDQo=